/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.servicoimpl;

import br.com.deployment.dao.ImovelDaoImpl;
import br.com.deployment.entidade.empresa.Cartorio;
import br.com.deployment.entidade.humana.Pessoa;
import br.com.deployment.entidade.registroimovel.*;
import br.com.deployment.servico.*;
import br.com.deployment.utilitario.Msg;
import br.com.deployment.utilitario.Sexo;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
 *
 * @author roniere
 */
@Stateless
@LocalBean
public class ImovelServicoImpl implements ImovelServico {

    @EJB
    ImovelDaoImpl imovelDao;
    
    @EJB
    OperacaoServico operacaoDao;
    @EJB
    CidadeServico cidadeDao;
    @EJB
    UsuarioServico usuarioDao;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    TransferenciaServico transferenciaDao;
    @EJB
    TituloServico tituloDao;
    @EJB
    LivroServico livroServico;
    @EJB
    FolhaServico folhaServico;
    @EJB
    private CartorioServico cartorioServico;
    
    private BigDecimal areaAtual;
    private List<Imovel> atualizarImovel;
    private Cartorio cartorio;
    
    @PostConstruct
    public void init(){
        cartorio = cartorioServico.getCartorioContext();
    }
    
    @Override
    public void create(Imovel imovel, Transferencia transferencia) {

        imovel.setDataCadastro(new Date());
        if (verificaAreaAnterior(imovel)) {
            
            if(imovel.getFolhasString() !=  null && imovel.getFolhasString().length() > 0){
                
                String[] folha = imovel.getFolhasString().split("-");
                List<Folha> lstFolhas = new ArrayList<Folha>();
                
                for (int i = 0; i < folha.length; i++) {
                    
                    lstFolhas.addAll(folhaServico.getFolhaLivro(
                             Integer.valueOf(folha[i]), imovel.getLivro().getId()));
                }
                
            }
            
            transferir(imovel, transferencia);
        }
    }

    public void atualizaImoveis() {
        for (Imovel imovel : atualizarImovel) {
            imovelDao.update(imovel);
        }

    }

    public boolean verificaAreaAnterior(Imovel imovel) {
        atualizarImovel = new ArrayList<Imovel>();
        areaAtual = new BigDecimal(BigInteger.ZERO);
        imovel.setOperacao(operacaoDao.find(imovel.getOperacao().getId()));

        BigDecimal areaImovel = imovel.getObjeto().getAreaOriginal();

        if (areaImovel != null) {
            areaAtual.add(areaImovel);

            if (imovel.getImovelAnterior() != null
                    && imovel.getOperacao().isRegAnterior()
                    && imovel.getOperacao().isAreaAnterior()) {

                System.err.println("if= " + imovel.getImovelAnterior());

                if (imovel.getImovelAnterior().size() > 1) {
                    System.err.println("if tamanho" + imovel.getImovelAnterior().size());
                    BigDecimal sumArea = new BigDecimal(BigInteger.ZERO);

                    for (Imovel imovelAnt : imovel.getImovelAnterior()) {
                        imovelAnt = find(imovelAnt.getId());
                        sumArea.add(imovelAnt.getObjeto().getAreaAtual());
                    }

                    if (areaImovel.compareTo(sumArea) != 0) {
                        Msg.messagemError("A área do novo terreno, deve ser idêntico a soma "
                                + "das área dos terrenos anteriores");

                        return false;
                    } else {
                        System.err.println("Else união");
                        for (Imovel imovelAnt : imovel.getImovelAnterior()) {
                            imovelAnt.getObjeto().setAreaAtual(new BigDecimal(BigInteger.ZERO));
                            atualizarImovel.add(imovelAnt);
                        }
                        return true;
                    }

                } else {
                    for (Imovel imovelAnt : imovel.getImovelAnterior()) {
                        imovelAnt = find(imovelAnt.getId());

                        if (areaImovel.compareTo(imovelAnt.getObjeto().getAreaAtual()) == 1) {

                            Msg.messagemError("A área do imóvel deve ser inferior ou igual a àrea do(s)"
                                    + "imóvel(is) anteriores");
                            return false;

                        } else {
                            areaAtual = new BigDecimal(BigInteger.ZERO);
                            areaAtual = imovelAnt.getObjeto().getAreaAtual().subtract(areaImovel);
                            imovelAnt.getObjeto().setAreaAtual(areaAtual);
                            atualizarImovel.add(imovelAnt);
                            System.err.println("Else desme " + areaAtual);
                            return true;
                        }
                    }
                }

            }
        }
        return true;
    }

    @Override
    public void edit(Imovel imovel) {
        imovelDao.update(imovel);
    }

    @Override
    public void remove(Imovel imovel) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Imovel find(int id) {
        return imovelDao.find(id);
    }

    @Override
    public List<Imovel> findAll() {
        return imovelDao.findAll();
    }

    @Override
    public List<Imovel> findImovelLimit(int limit, String registro) {
        return imovelDao.findImovelLimit(limit, registro);
    }

    @Override
    public List<Imovel> findImovel(Imovel imovel, Pessoa pessoaAdquirente, Pessoa pessoaTransmitente) {
        return imovelDao.findImovel(imovel, pessoaAdquirente, pessoaTransmitente);
    }

    @Override
    public Imovel findTransf(Imovel imovel) {
        return imovelDao.findTransf(imovel);
    }

    @Override
    public List<GeoRef> geoRefAll() {
        return imovelDao.geoRefAll();
    }

    @Override
    public void interseccao(Geometry gmt, Imovel objIm) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean verificaMap(List<GeoRef> lstGeoRef) {

        try {
            WKTReader reader = new WKTReader(new GeometryFactory());
            String p1 = "POLYGON((";

            if (lstGeoRef.size() > 3) {

                for (GeoRef gf : lstGeoRef) {
                    p1 += gf.getLat() + " " + gf.getLng() + ", ";
                }
                p1 += lstGeoRef.get(0).getLat() + " " + lstGeoRef.get(0).getLng() + " )) ";

                com.vividsolutions.jts.geom.Polygon polygon1 =
                        (com.vividsolutions.jts.geom.Polygon) reader.read(p1);


                List<Imovel> lstI = imovelDao.findAll();
                for (Imovel im : lstI) {
                    if (im.getObjeto() != null) {
                        String p2 = "POLYGON((";

                        List<GeoRef> lstGF = im.getObjeto().getGeoReferenciamento();

                        if (lstGF.size() >= 4) {
                            for (GeoRef gf : lstGF) {
                                p2 += gf.getLat() + " " + gf.getLng() + ", ";
                            }
                            p2 += lstGF.get(0).getLat() + " " + lstGF.get(0).getLng() + " ))";

                            com.vividsolutions.jts.geom.Polygon polygon2 = (com.vividsolutions.jts.geom.Polygon) reader.read(p2);

                            if (polygon1.intersects(polygon2)) {
                                if (polygon2.contains(polygon1)) {
                                    interseccao(polygon1, im);
                                }
                                if (polygon1.contains(polygon2)) {
                                    interseccao(polygon2, im);
                                } else {
                                    interseccao(polygon1.intersection(polygon2), im);
                                }
                                Msg.messagemError("ÁREA INCORRETA");
                                return true;
                            }
                        }

                    }
                }
            }
        } catch (ParseException ex) {
            Logger.getLogger(ImovelServicoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    @Override
    public void transferir(Imovel imovel, Transferencia transferencia) {
        if (imovel != null) {
            if (transferencia.getAdquirente() != null) {
                transferencia.setUsuario(usuarioServico.getUsuario());
                transferencia.setImovel(imovel);
                transferencia.setDataCadastro(new Date());
                transferencia.setTexto(geraTextoTransferencia(transferencia));

                imovelDao.save(imovel);
                transferencia.getImovel().setId(imovelDao.findTransf(imovel).getId());
                atualizaImoveis();
                transferenciaDao.create(transferencia);
                Msg.messagemInfo("Imóvel cadastrado com Sucesso ! ");
            } else {
                Msg.messagemError("Cadastro de Imóvel deve conter um ou mais adquirentes!");
                return;
            }
        } else {
            Msg.messagemError("O imóvel deve ter Titulo");
            return;
        }
    }

    @Override
    public String geraTextoTransferencia(Transferencia transTexto) {
        System.err.println("---GERANDO TEXTO--");

        String[] registro = transTexto.getImovel().getRegistro().toString().split("-");
        String texto = "";

        texto += "R#numero/" + registro[0] + "";

        if (transTexto.getTransmitente() != null) {
            texto += " - <b>TRANSMITENTE:</b>";

            for (Pessoa pessoa1 : transTexto.getTransmitente()) {
                texto += pessoa1.getNome() + ", "
                        + (pessoa1.getEndereco().getPais() == null ? "" : pessoa1.getEndereco().getPais().equalsIgnoreCase("Brasil") ? (pessoa1.getSexo() == Sexo.Masculino ? "Brasileiro" : "Brasileira") : "")
                        + (pessoa1.getEstadocivil() == null ? "" : ", " + pessoa1.getEstadocivil().toString())
                        + (pessoa1.getProfissao() == null ? "" : ", " + pessoa1.getProfissao().toString())
                        + ", residente e domiciliado ";

                texto += pessoa1.getEndereco().getTipo_logradouro().toString().toLowerCase()
                        + "" + (pessoa1.getEndereco().getLogradouro() == null ? " " : " " + pessoa1.getEndereco().getLogradouro())
                        + "" + (pessoa1.getEndereco().getBairro() == null ? " " : ", Bairro " + pessoa1.getEndereco().getBairro())
                        + "" + (pessoa1.getEndereco().getCidade().getNom_cidade() == null ? "" : " " + ", " + pessoa1.getEndereco().getCidade().getNom_cidade())
                        + "" + (pessoa1.getEndereco().getEstado().getNom_estado() == null ? "" : ", " + pessoa1.getEndereco().getEstado().getNom_estado());

                texto += " "
                        + pessoa1.getCpf() == null ? "" : ", portador do CPF nº " + pessoa1.getCpf()
                        + pessoa1.getRg() == null ? "" : " e do RG nº " + pessoa1.getRg() + ", ";

                texto += ""
                        + pessoa1.getCnpj() == null ? "" : ", portador do CNPJ nº" + pessoa1.getCnpj();
            }

            texto += ";<b> ADQUIRENTE: </b>";

        } else {
            texto += ";<b> PROPRIETÁRIO: </b>";
        }


        if (transTexto.getAdquirente() != null) {
            for (Pessoa pessoa1 : transTexto.getAdquirente()) {

                texto += pessoa1.getNome() + ", "
                        + (pessoa1.getEndereco().getPais() == null ? "" : pessoa1.getEndereco().getPais().equalsIgnoreCase("Brasil") ? (pessoa1.getSexo() == Sexo.Masculino ? "Brasileiro" : "Brasileira") : "")
                        + "" + (pessoa1.getEstadocivil() == null ? "" : ", " + pessoa1.getEstadocivil().toString())
                        + "" + (pessoa1.getProfissao() == null ? "" : ", " + pessoa1.getEstadocivil().toString()) + ","
                        + " residente e domiciliado ";

                texto += pessoa1.getEndereco().getTipo_logradouro().toString().toLowerCase()
                        + "" + (pessoa1.getEndereco().getLogradouro() == null ? " " : " " + pessoa1.getEndereco().getLogradouro())
                        + "" + (pessoa1.getEndereco().getBairro() == null ? "" : ", Bairro " + pessoa1.getEndereco().getBairro())
                        + "" + (pessoa1.getEndereco().getCidade().getNom_cidade() == null ? "" : ", " + pessoa1.getEndereco().getCidade().getNom_cidade())
                        + "" + (pessoa1.getEndereco().getEstado().getNom_estado() == null ? "" : ", " + pessoa1.getEndereco().getEstado().getNom_estado()) + "";


                texto += ""
                        + (pessoa1.getCpf() == null ? "" : ", portador do CPF nº " + pessoa1.getCpf())
                        + (pessoa1.getRg() == null ? "" : " e do RG nº " + pessoa1.getRg());

                texto += (pessoa1.getCnpj() == null ? "" : ", portador do CNPJ nº" + pessoa1.getCnpj());
            }
        }
        if (tituloDao.find(transTexto.getTitulo().getId()) != null) {
            texto += ";<b> TÍTULO:</b>" + tituloDao.find(transTexto.getTitulo().getId()).getNome() + "";
            texto += "" + transTexto.getFormaTitulo() == null ? "" : ";<b> FORMA DO TÍTULO: </b>" + transTexto.getFormaTitulo();
        }
        texto += ". O REFERIDO É VERDADE, DOU FÉ./..-.-.-.-.-.-.-.-.-.-";

        return texto;
    }
}
